#include<iostream>
#include<signal.h>
#include<cstring>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

using namespace std;


void handler(int signo)
{
    pid_t rid = waitpid(-1, nullptr, 0);
    cout<<"child process quit normal"<<endl;
    cout<<"I am process : "<<getpid()<<" catch a signal: "<<signo<<endl;
}


int main()
{
    signal(17,handler);
    pid_t id = fork();
    if(id == 0)
    {
        while(true)
        {
            cout<<"I am child process : "<<getpid()<<endl;
            sleep(1);
            break;
        }
        exit(0);
    }

    while(true)
    {
        cout<<"I am father process : "<<getpid()<<endl;
        sleep(1);
    }
    return 0;
}











// int flag = 0;

// void handler(int signo)
// {
//     cout<<"catch a signal: "<<signo<<endl;
//     flag = 1;
// }

// int main()
// {
//     //在优化条件下，flag可能会直接优化到CPU寄存器中
//     while(!flag);
//     cout<<"process quit normal"<<endl;
//     return 0;
// }











// void handler(int signo)
// {
//     cout<<"catch a signal, signal number : "<<signo<<endl;
// }

// int main()
// {
//     struct sigaction act, oact;
//     memset(&act, 0, sizeof(act));
//     memset(&oact, 0, sizeof(oact));

//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 1);
//     // sigaddset(&act.sa_mask, 2);
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     act.sa_handler = handler;
    
//     sigaction(2, &act, &oact);

//     while(true)
//     {
//         cout<<"I am a process : "<<getpid()<<endl;
//         sleep(1);
//     }
//     return 0;
// }